Add soft_symcover! and soft_cover! refiners - #29
Merged
Merged
Conversation
Every other cover family paired a solver that owns a start menu with a
refiner that takes one start from the caller; the soft covers had only
the solver. The kernels for the missing half already existed as the
single-start coordinate descents the multistart drives, so the refiners
expose what was there rather than adding numerics.
This completes one rule across the whole grid: the plain form owns the
menu, so its result is a property of A, while the ! form refines the one
start it is given, so its result is a property of A and that start.
symcover!/cover! sit outside the rule because they are initializers --
they build a cover from scratch and never read the vector passed in.
The soft refiners take a start that need not cover A, since the soft
objective constrains nothing; callers should build one with
initialize_symcover(...; feasible=:none).
The shared start-validation prologues now take the caller's name, so a
bad start reports the function the user actually called instead of
always naming the *_min form.
Also state the soft tier contract in the manual: soft_* is always native
and best-effort, soft_*_min is a true minimizer that may require an
extension. The claim that the soft *_min solvers were "likewise
JuMP-backed (HiGHS for AbsLog{2})" was wrong on both counts -- AbsLog{2}
is native there and HiGHS is never used for soft covers.
Assisted-by: Claude Opus 4.8 <noreply@anthropic.com>
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #29 +/- ##
==========================================
+ Coverage 98.51% 98.53% +0.02%
==========================================
Files 12 12
Lines 2016 2052 +36
==========================================
+ Hits 1986 2022 +36
Misses 30 30 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Every other cover family paired a solver that owns a start menu with a
refiner that takes one start from the caller; the soft covers had only
the solver. The kernels for the missing half already existed as the
single-start coordinate descents the multistart drives, so the refiners
expose what was there rather than adding numerics.
This completes one rule across the whole grid: the plain form owns the
menu, so its result is a property of A, while the ! form refines the one
start it is given, so its result is a property of A and that start.
symcover!/cover! sit outside the rule because they are initializers --
they build a cover from scratch and never read the vector passed in.
The soft refiners take a start that need not cover A, since the soft
objective constrains nothing; callers should build one with
initialize_symcover(...; feasible=:none).
The shared start-validation prologues now take the caller's name, so a
bad start reports the function the user actually called instead of
always naming the *_min form.
Also state the soft tier contract in the manual: soft_* is always native
and best-effort, soft_*_min is a true minimizer that may require an
extension. The claim that the soft *_min solvers were "likewise
JuMP-backed (HiGHS for AbsLog{2})" was wrong on both counts -- AbsLog{2}
is native there and HiGHS is never used for soft covers.
Assisted-by: Claude Opus 4.8 noreply@anthropic.com